package com.ql.reflect.beanUtil;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

//使用内省的方式来访问javabean
//Jdk中的api ： PropertyDescriptor类操作Bean的属性
public class Demo
{
    public static void main(String[] args) throws Exception{
    	// 内省
        User user=new User();
        //创建属性描述器
        PropertyDescriptor descriptor=new PropertyDescriptor("name",User.class);
        //获得写方法
        Method writeMethod=descriptor.getWriteMethod();
        //调用写方法
        writeMethod.invoke(user, "zhangsan");
        System.out.println(user);
        
        System.out.println("=============传统的方法=============");
        //  传统的方法
        User user1=new User();
        user1.setName("zhangsan");
        user1.setAge(19);
        System.out.println(user1);
        /**
		简化书写，实现通用性。这里写一个通用的方法，让属性名称为一个变量，
		 假如属性名很多的话，得到属性名后，就可以遍历，然后给他们一一的赋值，这就是内省的魅力。
		如果不用反射，那么传统的方式是不可能实现通用的。
        **/
        // 内省
        User user3 = new User();
        setProperty(user3, "name", "zhangsan3");
        setProperty(user3, "age", 21);
        System.out.println(user3);
        
    }
    
    
 // 实现一个通用的方法   为任意的一个javabean的任意属性赋任意值
    public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
        // 创建属性描述器
        PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());
        // 获得 写方法
        Method writeMethod = descriptor.getWriteMethod();
        // 调用 写方法
        writeMethod.invoke(bean, value);
    }
    
}
